package upload.view;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

@Component
//다운로드를 처리할 View 구현
//View - Abstract extends
public class DownloadView extends AbstractView {
	private String fileDirectory = "c:\\day\\upfile"; //다운로드 처리할 파일들의 경로

	@Override
	public String getContentType() {
		return "application/octet-stream"; // 파일을 stream을 통해서 출력하겟다.
	}

	@Override
	//응답 로직 구현
	//매개변수 1 : Map - ModelAndView 의 Model
	protected void renderMergedOutputModel(Map<String, Object> model,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		//다운로드 시킬 파일명
		String fileName = (String)model.get("fileName");
		File downFile = new File(fileDirectory, fileName);
		//응답 헤더 설정
		//응답 content-type 지정
		response.setContentType(getContentType());
		//다운로드할 파일의 파일명
		String newFilename = new String(fileName.getBytes("euc-kr"), "8859_1");
		response.setHeader("Content-Disposition", "attachment; filename="+newFilename);
		
		
		//IO
		FileInputStream fi = new FileInputStream(downFile);//파일과 연결된 InputStream
		OutputStream os = response.getOutputStream();
		FileCopyUtils.copy(fi, os);//fi로 읽은 것을 OS로 출력 처리
		
		/*
		byte [] bb = new byte[10000]; //한번에 1000-바이트 읽어라
		int b = fi.read(bb);
		while(b != -1) {
			os.write(bb, 0, b);
			b = fi.read(bb);
		}
		*/
	}

	

}
